package com.lkqm.seckill.service;

import com.lkqm.seckill.dto.Exposer;
import com.lkqm.seckill.dto.SeckillExecution;
import com.lkqm.seckill.entity.Seckill;
import com.lkqm.seckill.exception.RepeatSeckillException;
import com.lkqm.seckill.exception.SeckillClosedException;
import com.lkqm.seckill.exception.SeckillException;

import java.util.List;

/**
 * 秒杀系统Service
 * 思考：设计service，站在“使用者”角度
 * 3个关注点：颗粒度、参数、返回值（return / 异常）
 * 备注：spring事务是可以处理 运行时异常的
 * Created by luokaiqiongmou on 2016/11/27.
 */
public interface SeckillService {

    /**
     * 查询所有秒杀记录
     *
     * @return
     */
    List<Seckill> getSeckillList();

    /**
     * 查询单个秒杀记录
     *
     * @param seckillId
     * @return
     */
    Seckill getById(long seckillId);


    /**
     * 导出秒杀地址
     *
     * @param seckllId
     * @return
     */
    Exposer exportSeckillUrl(long seckllId);

    /**
     * 执行秒杀
     *
     * @param seckillId
     * @param userPhone
     * @param md5
     * @return
     */
    SeckillExecution executeSeckill(long seckillId, long userPhone, String md5)
            throws SeckillException, RepeatSeckillException, SeckillClosedException;

    /**
     * 执行秒杀，使用存储过程
     * @param seckillId
     * @param userPhone
     * @param md5
     * @return
     */
    SeckillExecution executeSeckillProcedure(long seckillId, long userPhone, String md5);
}
